package model

import (
	"fmt"
	"nexus/internal/config"
	"nexus/utils"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type NexusDB gorm.DB

func NewNexusDB(c config.Config, logger *utils.Logger) *NexusDB {
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%v)/%s?charset=utf8&parseTime=True&loc=Local",
		c.NexusDB.User, c.NexusDB.Password,
		c.NexusDB.Host, c.NexusDB.Port,
		c.NexusDB.Schema)

	db, err := gorm.Open(mysql.New(mysql.Config{
		DSN:                       dsn,
		DisableDatetimePrecision:  true,
		DontSupportRenameIndex:    true,
		DontSupportRenameColumn:   true,
		SkipInitializeWithVersion: false,
	}), &gorm.Config{
		Logger: logger,
	})
	if err != nil {
		panic("init db fail:" + err.Error())
	}
	// 维护连接池
	sqlDB, err := db.DB()
	if err != nil {
		panic("init db fail:" + err.Error())
	}

	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(c.NexusDB.MaxIdleConns)

	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(c.NexusDB.MaxOpenConns)

	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	sqlDB.SetConnMaxLifetime(time.Duration(c.NexusDB.ConnMaxLifetime) * time.Minute)

	return (*NexusDB)(db)
}
